/**
 * 
 */
package cn.nawang.ebeim.client.util;

import java.io.File;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.nawang.ebeim.client.bean.DataSource;
import cn.nawang.ebeim.client.bean.FileBackupTask;
import cn.nawang.ebeim.client.bean.TaskStatusBean;
import cn.nawang.ebeim.client.bean.VersionBackupTask;
import cn.nawang.ebeim.client.version.FileInfo;

/**
 * @ClassName: DealUnfinishTask
 * @Description: 处理未完成的任务
 * @author 张建峰
 * @date 2015年8月27日 下午6:00:01
 * @version v1.0
 */
public class DealUnfinishTask {

  private static final Logger LOG = LoggerFactory.getLogger(DealUnfinishTask.class);

  private int retries;

  public int getRetries() {
    return retries;
  }

  public void setRetries(int retries) {
    this.retries = retries;
  }

  /**
   * @author 张建峰
   * @Description: 执行未完成的任务
   * @param @param taskStatusBean
   * @return void
   * @date 2015年8月28日上午11:55:37
   *
   * @修改人 张建峰
   * @修改日期
   */
  public void doUnfinishedTask(TaskStatusBean taskStatusBean, String isEncrypt) {

    if (taskStatusBean.getType() == DbUtil.TASK_TYPE_FILE) {
      doFileTask(taskStatusBean, isEncrypt);
    } else if (taskStatusBean.getType() == DbUtil.TASK_TYPE_VERSION) {
      doVersionTask(taskStatusBean);
    }

  }

  /**
   * @author 张建峰
   * @Description: 执行数据文件任务
   * @param @param taskStatusBean
   * @return void
   * @date 2015年8月28日上午11:55:49
   *
   * @修改人 张建峰
   * @修改日期
   */
  public void doFileTask(TaskStatusBean taskStatusBean, String isEncrypt) {
    LOG.info("backup data file {}" + taskStatusBean);
    if (CommonMethodsUtils.exists(taskStatusBean.getDsId(), taskStatusBean.getSignature())) {
      LOG.info("data file already exists, do nothing. {}", taskStatusBean);
      return;
    }

    String srcPath = taskStatusBean.getDsPath() + File.separator + taskStatusBean.getInfoPath();
    File file = new File(srcPath);
    if (!file.exists()) {
      LOG.error("file to backup doesn't exists:{}", srcPath);
      return;
    }

    String dstPath =
        FileUtil.getUploadDataFilePath(taskStatusBean.getDsId(), taskStatusBean.getInfoPath());
    File dFile = new File(dstPath);
    if (!dFile.exists()) {
      dFile.mkdirs();
    }

    if (taskStatusBean.getStatus() != DbUtil.TASK_STATUS_ENCRYPT
        && isEncrypt.equals(Constants.IS_ENCRYPT_YES)) {
      /** 加密文件 */
      CommonMethodsUtils.encrypt(srcPath, dstPath, taskStatusBean.getInfoName());
    }

    uploadDataFile(taskStatusBean);

  }

  /**
   * @author 张建峰
   * @Description: 执行版本任务
   * @param @param taskStatusBean
   * @return void
   * @date 2015年8月28日上午11:56:04
   *
   * @修改人 张建峰
   * @修改日期
   */
  public void doVersionTask(TaskStatusBean taskStatusBean) {
    LOG.info("backup version file {}", taskStatusBean);

    File versionFile = new File(FileUtil.getVersionFilePath(taskStatusBean.getDsId(),
        taskStatusBean.getVersion().getVersion()));
    if (!versionFile.exists()) {
      DataSource ds = new DataSource();
      ds.setId(taskStatusBean.getDsId());
      ApiUtil.updateDataSourceStatus(ds, Constants.DS_RUN_STATUS_SUCCESS);
      DbUtil.deleteTaskStatusVersion(taskStatusBean.getDsId(), taskStatusBean.getVersion());
      return;
    }

    if (taskStatusBean.getStatus() != DbUtil.TASK_STATUS_ZIP) {
      /** 压缩版本树文件 */
      String src = FileUtil.getVersionFilePath(taskStatusBean.getDsId(),
          taskStatusBean.getVersion().getVersion());
      String dst = FileUtil.getZipVersionFilePath(taskStatusBean.getDsId(),
          taskStatusBean.getVersion().getVersion()) + ".zip";
      new ZipUtil().zip(src, dst);
    }

    uploadVersionFile(taskStatusBean);
  }

  /**
   * @author 张建峰
   * @Description: 版本文件上传
   * @param @param taskStatusBean
   * @return void
   * @date 2015年8月28日下午2:34:19
   *
   * @修改人 张建峰
   * @修改日期
   */
  public void uploadVersionFile(TaskStatusBean taskStatusBean) {

    VersionBackupTask task = new VersionBackupTask();
    DataSource ds = new DataSource();
    ds.setId(taskStatusBean.getDsId());
    task.setDataSource(ds);

    task.setVersion(taskStatusBean.getVersion());

    LOG.info("upload verison file: {}", task);

    task.upload();

  }

  /**
   * @author 张建峰
   * @Description: 数据文件上传
   * @param @param taskStatusBean
   * @return void
   * @date 2015年8月28日下午2:34:07
   *
   * @修改人 张建峰
   * @修改日期
   */
  public void uploadDataFile(TaskStatusBean taskStatusBean) {

    FileBackupTask task = new FileBackupTask();
    DataSource ds = new DataSource();
    ds.setId(taskStatusBean.getDsId());
    ds.setDsType(String.valueOf(taskStatusBean.getDsType()));
    ds.setRoot(taskStatusBean.getDsPath());
    ds.setIsEncrypt(taskStatusBean.getIsEncrypt());
    ds.setCreateUserId(Integer.valueOf(PropertiesUtil.read(PropertiesConstants.USER_ID)));
    task.setDataSource(ds);
    task.setIsEncrypt(taskStatusBean.getIsEncrypt());
    
    FileInfo info = new FileInfo();
    info.setFileSize(taskStatusBean.getFileSize());
    info.setName(taskStatusBean.getInfoName());
    info.setPath(taskStatusBean.getInfoPath());
    info.setSignature(taskStatusBean.getSignature());
    info.setTryCount(taskStatusBean.getTryCount());

    task.setInfo(info);

    LOG.info("upload data file:{}", task);

    task.upload();

  }

}
